///
///
/// OSMAN TASKIN 2010-2011 - TRADING RELATED FUNCTIONS
///
/// Last update 11.03.2011


// bool NoTradesByMAGIC(int magic1,int magic2=923421482,int magic3=1726418,int magic4=16282424)
// int MarketTrade(int magic)
// int MarketTradeLast(int magic)
// int FindNewestMarketTradeByMagic(int MAGIC=0)
// int PendingTrade(int magic)
// int ConnectCheck() 
// bool SetBreakEvenByTicketID(int ticket)
// bool TradeSearchForTradeAtBar (datetime bartime,int magic1,int magic2=6241244242,bool ignoresymbol=false,bool SearchLiveTrades=false)
// bool TradeSearchByComment (string searchstr,int magic1,int magic2=62412422,bool ignoresymbol=false,bool SearchLiveTrades=false)
// int CloseAllByMagic(int SLIPPAGE,int MagicNumber1,int MagicNumber2=1264729)
// int CloseMarketTrade(int SLIPPAGE,int MagicNumber1,int MagicNumber2=1264729)

// int DeletePendingsByMagic(int MagicNumber1,int MagicNumber2=1264729)
// int MarketTradeCount(int magic,int magic2=-1)
// int GetTradeType(int magic)
// int PendingTradeCount(int magic,int magic2=-1)
// string OrderType2String(int typ);
// int OrdersCountByType(int typ,int M=0)
// int BarsSinceEntry(int Ticket)
// double calcPL(int Magic1,int Magic2=47284,bool ignoreMagic=false)

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Ordercomment max lenght 31 chars
// Magicnumber max lenght 10 digits 

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// returns true if no market and pending trades are active with given 
// magic number(s), it search within current symbol
bool NoTradesByMAGIC(int magic1,int magic2=923421482,int magic3=1726418,int magic4=16282424)
{
	int total = OrdersTotal();	
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && (OrderMagicNumber() == magic1 || OrderMagicNumber() == magic2 || OrderMagicNumber() == magic3 || OrderMagicNumber() == magic4 ))	  {  return(false);	}
		    }
	}
return(true);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// return ticket from given magic market trade inside same symbol, 
// else it returns 0
// 
int MarketTrade(int magic)
{	
	int total = OrdersTotal();	
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && (OrderType()==OP_BUY || OrderType()==OP_SELL))	  {  return(OrderTicket());	}
		    }
	}
	return(0);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// return ticket from given magic market trade inside same symbol, 
// It returns latest position (patch since 29.03)
// else it returns 0
// 
int MarketTradeLast(int magic)
{	
   int p=0;
	int total = OrdersTotal();	
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && (OrderType()==OP_BUY || OrderType()==OP_SELL))	  {  p=OrderTicket();	}
		    }
	}
	return(p);
}

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// return ticket from given magic market trade inside same symbol, else
// it returns 0
int MarketType(int magic)
{	
	int total = OrdersTotal();	
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && (OrderType()==OP_BUY || OrderType()==OP_SELL))	  {  return(OrderType());	}
		    }
	}
	return(-99999);
}

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// return ticket from given magic market trade inside same symbol, else
// it returns 0
int PendingTrade(int magic)
{	
	int total = OrdersTotal();	
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && (OrderType()!=OP_BUY && OrderType()!=OP_SELL))	  {  return(OrderTicket());	}
		    }
	}
	return(0);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Check if MT4 is connected,if not sleep 500ms
int ConnectCheck() { if (IsConnected()==false) { Sleep(500); } }
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// searches if there was any trade initiated at this specified bar in 
// history and LiveTrades (default off, SearchLiveTrades), searches only inside current symbol(can be switched off via ignore symbol)
// returns true if there was a trade initiated inside that given bar time Period
bool TradeSearchForTradeAtBar (datetime bartime,int magic1,int magic2=6241244242,bool ignoresymbol=false,bool SearchLiveTrades=false)
{ 
   int total = OrdersHistoryTotal();		
	for (int i = 0; i < total; i++)
	{
	   
		if (   OrderSelect(i, SELECT_BY_POS,MODE_HISTORY )) 		
		{			    
         if (                        
            (OrderSymbol()==Symbol() || ignoresymbol==true) && (OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2)     
            && (OrderOpenTime()>=bartime && OrderOpenTime()<bartime+Period()*60)
            ) { return(true); }
				
		}
   }
   
   if (SearchLiveTrades)
   {
   total = OrdersTotal();		
	for (i = 0; i < total; i++)
	{
	   
		if (   OrderSelect(i, SELECT_BY_POS )) 		
		{			    
         if (                        
            (OrderSymbol()==Symbol() || ignoresymbol==true) && (OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2)     
            && (OrderOpenTime()>=bartime && OrderOpenTime()<bartime+Period()*60)
            ) { return(true); }
				
		}
   }
   }


return(false);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// searches within history for specific string in history
// TradeSearchByComment("TT POS2",MAGIC1,MAGIC2)
// This version searches by current symbol
// returns true in case such a trade has been found
// string mark = "#"+Time[ibar]+"-"+Period(); or other
// symbol can be ignored
// Live Trades can be also searched
bool TradeSearchByComment (string searchstr,int magic1,int magic2=62412422,bool ignoresymbol=false,bool SearchLiveTrades=false)
{
   // Search History   
   int total = OrdersHistoryTotal();		
	for (int i = 0; i < total; i++)
	{
	   
		if (   OrderSelect(i, SELECT_BY_POS,MODE_HISTORY )) 		
		{			 
         if (                        
            (OrderSymbol()==Symbol() || ignoresymbol==true) && (OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2)     
            && (StringFind(OrderComment(),searchstr)!=-1)
            ) { return(true); }
				
		}
   }


if (SearchLiveTrades) 
{
   // Search Active Trades
   total = OrdersTotal();		
	for (i = 0; i < total; i++)
	{
	   
		if (   OrderSelect(i, SELECT_BY_POS )) 		
		{			 
         if (                        
            (OrderSymbol()==Symbol() || ignoresymbol==true) && (OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2)     
            && (StringFind(OrderComment(),searchstr)!=-1)
            ) { return(true); }
				
		}
   }
}


return(false);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// easy log add script
//void l2(string s,color clr=LavenderBlush)  { if (clr==LavenderBlush) { LogAdd(s); } else { LogAddColor(s,clr); } }
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Closes all market positions by magic and symbol(current)
int CloseMarketTrade(int SLIPPAGE,int MagicNumber1,int MagicNumber2=1264729)
{
int total = OrdersTotal();	   
RefreshRates();
for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		          if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber1 || OrderMagicNumber() == MagicNumber2)  )
		           {
		            if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,SLIPPAGE); RefreshRates();
		            if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,SLIPPAGE);
		           }
		          
		    }
	}   
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Closes all market positions by magic and symbol(current)
int CloseAllByMagic(int SLIPPAGE,int MagicNumber1,int MagicNumber2=1264729)
{
int total = OrdersTotal();	   
for (int k = 0; k < 3; k++)
{
Sleep(300);
for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		          if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber1 || OrderMagicNumber() == MagicNumber2)  )
		           {
		            RefreshRates();
		            Print("@CloseAllByMagic@ - Closing trade ",OrderTicket());
		            if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,SLIPPAGE); RefreshRates();
		            if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,SLIPPAGE);
		           }
		          
		    }
	}   
}
}

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Deletes all pendings from current symbol with given magic number(s)
// We delete pendings secure way
int DeletePendingsByMagic(int MagicNumber1,int MagicNumber2=1264729)
{
RefreshRates();
int deleted=1;
int total = OrdersTotal();	   
   while(deleted>0)
   {
	deleted=0;
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		          if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber1 || OrderMagicNumber() == MagicNumber2) && (OrderType()!=OP_BUY && OrderType()!=OP_SELL) )
		             { OrderDelete(OrderTicket()); deleted++; }
		          
		    }
	}   
	}
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// returns type of trade with magic number and current symbol, regardless market or pending
/*
int OrderType( ) 
Returns order operation type for the currently selected order. It can be any of the following values:
OP_BUY - buying position,
OP_SELL - selling position,
OP_BUYLIMIT - buy limit pending position,
OP_BUYSTOP - buy stop pending position,
OP_SELLLIMIT - sell limit pending position,
OP_SELLSTOP - sell stop pending position.
*/
int GetTradeType(int magic)
{	
	int total = OrdersTotal();	
	int c=0;
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) 		    
		    if (OrderSymbol() == Symbol() && (OrderMagicNumber() == magic )) {  return( OrderType() );	}		    
	}
	return(-99);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// returns count of positions open by this magic + magic2(optional)
int MarketTradeCount(int magic,int magic2=-1)
{	
	int total = OrdersTotal();	
	int c=0;
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && (OrderMagicNumber() == magic || OrderMagicNumber() == magic2) && (OrderType()==OP_BUY || OrderType()==OP_SELL))	  {  c++;	}
		    }
	}
	return(c);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// returns count of Pending positison by this magic + magic2(optional)
int PendingTradeCount(int magic,int magic2=-1)
{	
	int total = OrdersTotal();	
	int c=0;
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (   OrderSelect(i, SELECT_BY_POS)) {	
		    if (OrderSymbol() == Symbol() && (OrderMagicNumber() == magic || OrderMagicNumber() == magic2) && (OrderType()!=OP_BUY && OrderType()!=OP_SELL))	  {  c++;	}
		    }
	}
	return(c);
}
//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Counts order numbers which are in trade window currenty
// Example: OrdersCountByType(OP_BUYSTOP,123) will count all OP_BUYSTOPS!
// if M<0 we ignore magic!
int OrdersCountByType(int typ,int M=0)
{
int cnt=0;
RefreshRates();
for (int i=0;i<OrdersTotal();i++)
   {
   if (OrderSelect(i,SELECT_BY_POS))
      {
      if (  (M<0 || OrderMagicNumber()==M)  && (OrderType()==typ) ) cnt++;
      } 
   
   }
return(cnt);  
}


//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// scans for all market trades and finds latest(newest) (by entry date) trade and returns its Ticket, in case of probelm it returns 0
int FindNewestMarketTradeByMagic(int MAGIC=0)
{
   int lastDate = 0;
   int lastTicket = 0;
   for (int i=0;i<OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS))
         {                  
         if (OrderMagicNumber()==MAGIC)
            {
            if (OrderOpenTime()>=lastTicket) { lastDate=OrderOpenTime(); lastTicket=OrderTicket(); }
            }
         }
      }
  return(lastTicket);
}

//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// sets position to breakeven, not secure
bool SetBreakEvenByTicketID(int ticket)
{
if (OrderSelect(ticket,SELECT_BY_TICKET))
   {   
   return (OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),OrderExpiration()));
   }
return(false);
}

//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// converts 
string OrderType2String(int typ)
{

switch (typ)
   {
   case OP_BUY : return("BUY");
   case OP_SELL : return("SELL");
   case OP_BUYLIMIT : return("BUYLIMIT");
   case OP_SELLLIMIT : return("SELLLIMIT");
   case OP_BUYSTOP: return("BUYSTOP");
   case OP_SELLSTOP: return("SELLSTOP");
   default: return("n/a");   
   }

}

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
// Find How many bars ago we entered Market, it must be a market order
// returns <0 if error
// return 3 means that we entered 3 bars ago, 0 indicate enter was at current bar
int BarsSinceEntry(int Ticket)
{
if (OrderSelect(Ticket,SELECT_BY_TICKET))
   {
   if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {      
      for (int i=0;i<100;i++)
         {
         if (OrderOpenTime()>=Time[i] && OrderOpenTime()<Time[i]+Period()*60) { return (i); }
         }      
      } else { return(-2); }


   
   }
else
   {
   // problem
   return(-1);
   }

}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// Calculates Profit Loose of given Magics on current Symbol
double calcPL(int Magic1,int Magic2=47284,bool ignoreMagic=false)
{
// PL
double tickvalue = (MarketInfo(OrderSymbol(),MODE_TICKVALUE));
double PV = (MarketInfo(OrderSymbol(),MODE_POINT));
double PL = 0;
for (int i=0;i<OrdersTotal();i++)
   {
   if (OrderSelect(i,SELECT_BY_POS))
      {
      if (Symbol()==OrderSymbol() && (OrderMagicNumber()==Magic1 || OrderMagicNumber()==Magic2 || ignoreMagic))
         {      
         if (OrderType()==OP_BUY) PL+=OrderLots()*tickvalue*((Bid-OrderOpenPrice()) / PV);
         if (OrderType()==OP_SELL) PL+=OrderLots()*tickvalue*((OrderOpenPrice()-Ask) / PV);            
         }
      }
   
   }
return(PL);
}
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  
// -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  



